package si;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;


public abstract class Baza {
	//private static MysqlConnectionPoolDataSource pol = new MysqlConnectionPoolDataSource();
	private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
	private static final String URL = "jdbc:mysql://localhost";
	private static final String nazwaBazy = "pilkarze";
	private static String username = "root";
	private static String password = "";
	
	static{
		
		/*pol.setUser("hrab");
		pol.setPort(3306);
		pol.setDatabaseName("pilkarze");
		pol.setPassword("zlatan");
		pol.setEncoding("cp1250");*/
		
	}
	/**
	 * Ustawia nazwę bazy danych używanej póniej w programie.
	 * Bez wywołania tej metody
	 * @param nazwa
	 */

	
	/**
	 * Ustanawia połšczenie z konkretnš bazš na serwerze.
	 * @param nazwaBazy - Nazwa bazy z jakš chcemy się połšczyć.
	 * @return Połšczenie do bazy.
	 */
	public static Connection polacz(String nazwaBazy) {
		Connection conn = null;
		try {
			Class.forName(JDBC_DRIVER);
			conn = DriverManager.getConnection(URL+":"+"3306"+"/"+nazwaBazy, username, password);
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		} catch(SQLException e) {
			e.printStackTrace();
		}
			
		
			return conn;
		
		
	}
	
	/**
	 * Ustanawia połšczenie z serwerem baz danych.
	 * @return Połšczenie do serwera baz danych.
	 */
	public static Connection polacz() {
		Connection conn = null;
		try {
			Class.forName(JDBC_DRIVER);
			String conStr = URL+":"+"3306"+"/"+nazwaBazy;
			System.out.println(conStr);
			conn = DriverManager.getConnection(conStr, username, password);
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		} catch(SQLException e) {
			e.printStackTrace();
		}
			
		
			return conn;
	}
	
	/**
	 * Sprawdza czy baza o podanej nazwie juz istnieje.
	 * @param conn - Połšczenie do serwera bazy danych.
	 * @param name - Nazwa nowej bazy.
	 * @return Tak, jeli istnieje. Nie, jeli nie istnieje.
	 */
	private static boolean bazaIstnieje(Connection conn, String name) throws SQLException {
		ArrayList<String> list = new ArrayList<String>();
			
		DatabaseMetaData meta = conn.getMetaData();
		ResultSet rs = meta.getCatalogs();
			
		while(rs.next()) {
			String listofDatabases = rs.getString("TABLE_CAT");
			list.add(listofDatabases);
		}
		System.out.println(list);	
		if(list.contains(name.toLowerCase())) return true;
		else return false;
	}
	
	/**
	 * Tworzy bazę o podanej nazwie.
	 * @param name - Nazwa nowej bazy.
	 * @return Tak, jeli utworzono. Nie, w przeciwnym wypadku.
	 * @throws SQLException
	 */
	public static boolean utworzBaze(String name) throws SQLException {
		Connection conn = polacz();
		boolean baseExist = bazaIstnieje(conn, name);
		if(!baseExist) {
			Statement st = conn.createStatement();
			st.executeUpdate("CREATE DATABASE " + name + " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");
			conn.close();
			return true;
		} else return false;
	}
	
	/**
	 * Usuwa bazę o podanej nazwie.
	 * @param name - Nazwa bazy do usunięcia.
	 * @return Tak, jeli usunięto bazę. Nie, w przeciwnym wypadku.
	 * @throws SQLException
	 */
	public static boolean usunBaze(String name) throws SQLException {
		Connection conn = polacz();
		boolean baseExist = bazaIstnieje(conn, name);
		if(baseExist) {
			Statement st = conn.createStatement();
			st.executeUpdate("DROP DATABASE " + name);
			conn.close();
			return true;
		} else return false;
	}
	
	public static void main(String[] args) {
		Connection conn = Baza.polacz();
		if(conn != null) {
			System.out.println("Polaczono");
			try {
				conn.close();
				System.out.println("Rozlaczono");
			} catch(SQLException e) {
				e.printStackTrace();
			}
		}
		
		try {
			if(Baza.utworzBaze("test")) {
				System.out.println("Utworzono baze test");
			}
			else {
				System.out.println("Nie utworzono bazy test");
			}
			
			if(Baza.utworzBaze("aneczka")) {
				System.out.println("Utworzono baze aneczka");
			}
			else {
				System.out.println("Nie utworzono bazy aneczka");
			}
			
			if(Baza.usunBaze("aneczka")) {
				System.out.println("Usunieto baze aneczka");
			}
			else {
				System.out.println("Nie usunieto bazy aneczka");
			}
		} catch(SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void executeCreate(String sql){
		Connection conn = polacz();
		Statement st = null;
		
		try {
			st = conn.createStatement();
			st.executeUpdate(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println(sql);
			e.printStackTrace();
		}finally{
				try {
					if(conn != null)
						conn.close();
					if(st != null)
						st.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					
					e.printStackTrace();
				}
		}
		
	}
}
